/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.servico;

import br.com.foxinline.modelo.Grupo;
import br.com.foxinline.modelo.Usuario;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

/**
 *
 * @author ely
 */
@Stateless
public class UsuarioServico extends ServicoGenerico<Usuario> {

    @EJB
    GrupoServico grupoServico;

    public UsuarioServico() {
        super(Usuario.class);
    }

    public boolean usuarioObrigatorio(Usuario usuario) {
        return !usuario.getNome().equals("");
    }

    public boolean senhaObrigatorio(Usuario usuario) {
        return !usuario.getSenha().equals("");
    }

    public boolean verificaSenha(String senha, Usuario usuario) {
        return usuario.getSenha().equals(senha);
    }

    public Usuario existLogin(String doc) {
        Usuario usuario;
        String sql = "Select u from Usuario u where u.login ";
        sql += " like lower(:doc)";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("doc", doc);
        try {
            usuario = (Usuario) query.getResultList().get(0);

        } catch (NoResultException nr) {
            return null;
        } catch (NonUniqueResultException nre) {
            return null;
        } catch (Exception e) {
            return null;
        }

        return usuario;
    }

    /**
     *
     * @param senha
     * @param usuario
     * @return
     */
    public boolean verificaSenhaAntiga(String senha, Usuario usuario) {
        senha = Usuario.encryptPassword(senha);
        return senha.equals(usuario.getSenha());
    }

    public List<Usuario> pesquisarUsuario(Usuario usuario) {
        String sql = "SELECT u FROM Usuario u ";
        sql += " where ";
        if ((usuario.getNome() != null) && !usuario.getNome().equals("")) {
            sql += " lower(u.nome) like lower(:nome) and ";
        }
        if ((usuario.getLogin() != null) && !usuario.getLogin().equals("")) {
            sql += " lower(u.login) like lower(:login) and ";
        }
        sql += " 1=1 AND u.ativo = TRUE Order by u.id ASC ";
//        System.err.print(sql);
        Query query = getEntityManager().createQuery(sql);

        if ((usuario.getNome() != null) && !usuario.getNome().equals("")) {
            query.setParameter("nome", "%" + usuario.getNome() + "%");
        }
        if ((usuario.getLogin() != null) && !usuario.getLogin().equals("")) {
            query.setParameter("login", usuario.getLogin());
        }
        return (List<Usuario>) query.getResultList();
    }

    public String getNomeUsuario(String usuario) {
        String sql = "SELECT u.nome FROM Usuario u ";
        sql += " where ";

        if ((usuario != null) && !usuario.equals("")) {
            sql += " lower(u.login) like lower(:login) and ";
        }
        sql += " u.ativo = TRUE";

        Query query = getEntityManager().createQuery(sql);

        if ((usuario != null) && !usuario.equals("")) {
            query.setParameter("login", "%" + usuario + "%");
        }
        return (String) query.getSingleResult();
    }

    public Usuario verifySystemUserForLogin(String nome) {
        Usuario usr = null;
        try {
            final String sql = "select u from Usuario u where "
                    + "u.login like :nome";
            Query query = getEntityManager().createQuery(sql);
            query.setParameter("nome", nome);
            usr = (Usuario) query.getSingleResult();

        } catch (Exception e) {
            System.err.println("Nenhum usuário encontrado");
            return null;
        }
        return usr;
    }

    public Usuario getCurrentUser() {
        return verifySystemUserForLogin(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
    }

    public boolean isAdmin() {
        Grupo g = grupoServico.pesquisar(1L);

        return getCurrentUser().getGrupos().contains(g);
    }
}
